import pandas as pd
import conftest,os,re

# 从conftest模块获取mark标记
mark=conftest.mark

def convert_df_to_dict_list(df):
    '''
    将 DataFrame 转换为字典列表，其中第一行用作键，其余行用作值。
    :param df: pandas DataFrame
    :return: 转换后的字典列表
    '''
    # 获取列名作为字典键
    column_names = df.columns.tolist()
    # 使用pandas的to_dict方法转换为字典列表格式
    dict_list = df.to_dict(orient='records')
    return dict_list

def get_data(filepath):
    '''
    将 Excel 文件中的所有工作表读取出来，列表套字典格式
    :param filepath: Excel 文件路径
    :return: 包含所有工作表数据的字典和统计信息
    '''
    all_data = {}  # 存储所有工作表的数据
    data_list = []  # 最终返回的数据列表
    marked_count = 0  # 记录标记的数量
    skipped_count = 0  # 记录跳过的数量
    total_records = 0  # 记录总记录数
    
    # 读取Excel文件中的所有工作表
    sheets = pd.read_excel(filepath, sheet_name=None, engine='openpyxl')
    
    # 遍历每个工作表
    for sheet_name, df in sheets.items():
        # 将DataFrame转换为字典列表
        sheet_data = convert_df_to_dict_list(df)
        total_records += len(sheet_data)  # 累加总记录数
        
        # 处理mark标记
        if mark is None or mark == '':
            # 如果没有mark标记，使用全部数据
            mark_list = sheet_data
            marked_count += len(mark_list)
        else:
            # 检查是否包含反向标记'!'
            if '!' in mark:
                # 提取'!'后的标记值
                mark_value = mark.split('!')[1]
                # 统一转换为字符串比较
                mark_list = [record for record in sheet_data 
                           if str(record.get('mark', '')) != str(mark_value)]
                marked_count += len(mark_list)
                skipped_count += len(sheet_data) - len(mark_list)
            else:
                # 统一转换为字符串比较
                mark_list = [record for record in sheet_data 
                           if str(record.get('mark', '')) == str(mark)]
                marked_count += len(mark_list)
                skipped_count += len(sheet_data) - len(mark_list)
        
        # 存储处理后的数据
        all_data[sheet_name] = mark_list
    
    # 将数据整理为列表套字典的形式
    for sheet_name, records in all_data.items():
        for record in records:
            data_list.append(record)
    
    # 一次性打印最终统计信息
    if mark is None or mark == '':
        print(f"处理完成: 共处理 {total_records} 条记录 (全部使用)")
    elif '!' in mark:
        mark_value = mark.split('!')[1]
        print(f"处理完成: 共处理 {total_records} 条记录, 排除 mark={mark_value} 的记录 {skipped_count} 条, 使用 {marked_count} 条")
    else:
        print(f"处理完成: 共处理 {total_records} 条记录, 仅保留 mark={mark} 的记录 {marked_count} 条, 跳过 {skipped_count} 条")
    
    return data_list

def get_path(filename):
    '''
    获取测试用例文件的完整路径
    :param filename: 文件名
    :return: 完整的文件路径
    '''
    select = conftest.select  # 从conftest获取选择项
    projectPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 项目根目录
    # 拼接测试用例文件路径
    filename_path = os.path.join(projectPath, 'Test_Case_Data', select, filename)
    return filename_path

if __name__ == '__main__':
    print(get_path('XIN'))